package controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import BEANs.CiudadBean;
import BEANs.ClienteBean;
import BEANs.DatosPersonalesBean;
import BEANs.ListaCiudadesBean;
import BEANs.NavegationBean;
import BEANs.OfertaBean;
import BOs.ClienteBO;
import BOs.OfertaBO;

@ManagedBean
@SessionScoped
public class DatosPersonalesController {
		
	protected final Log logger = LogFactory.getLog(getClass());

	public void guardarCambios() {
		FacesContext context = FacesContext.getCurrentInstance();		
		ClienteBean clienteBean = (ClienteBean) context.getExternalContext().getSessionMap().get("clienteBean");
		DatosPersonalesBean datosPersonalesBean = (DatosPersonalesBean) context.getExternalContext().getSessionMap().get("datosPersonalesBean");		
		NavegationBean navegationBean = (NavegationBean) context.getExternalContext().getSessionMap().get("navegationBean");		
			
		if (clienteBean == null) {				
			logger.error("Error al intentar obtener los datos del cliente que se quiere actualizar");
			navegationBean.setError("Error al intentar actualizar un cliente");
			navegationBean.setViewedPage("datosPersonales.xhtml");							
		}else{				
			logger.info("Actualizando datos de cliente");
			ClienteBO clientesBo = new ClienteBO();													
				
			//Actualizamos los datos del cliente en BBDD
			if(!clientesBo.actualizarCliente(clienteBean)){
				navegationBean.setViewedPage("datosPersonales.xhtml");
				navegationBean.setError("Error al Actualizar los datos del Cliente");
			}else{
				
				List<CiudadBean> listaCiudadesFaltan = new ArrayList<CiudadBean>();
				
				//Transformar el String de Ciudades al Bean ListaCiudadesBean
				ListaCiudadesBean listaCiudadesDeseadas = new ListaCiudadesBean();				
				String[] ciudadesDeseadas = datosPersonalesBean.getListaCiudadesDeseadas().split("-");	
				this.transFormToListaCiudades(listaCiudadesDeseadas, ciudadesDeseadas);
				
				//Cargar Lista de Ciudades deseadas actuales
				OfertaBO ofertaBo = new OfertaBO();
				List<OfertaBean> ofertas = ofertaBo.cargarOfertas(clienteBean);
				
				for(CiudadBean ciudadDeseada : listaCiudadesDeseadas.getCiudades()){
					boolean exiteLaOferta = false;
					for(OfertaBean oferta : ofertas){
						if(oferta.getCiudadb().getCiudad().equals(ciudadDeseada.getCiudad())){
							exiteLaOferta = true;
						}
					}
					if(!exiteLaOferta){
						listaCiudadesFaltan.add(ciudadDeseada);
					}
				}
				
				listaCiudadesDeseadas.setCiudades(listaCiudadesFaltan);
				
				//Creamos la Ofertas				
				ofertaBo.crearOfertasAlta(listaCiudadesDeseadas, clienteBean);
				
				navegationBean.setViewedPage("principal.xhtml");				
			}								
		}
		context.getExternalContext().getSessionMap().put("navegationBean", navegationBean);
	}
	
	//Ciudades deseadas ciudad0Text,ciudad0Id-ciudad1Text,ciudad1Id-ciudad2Text,ciudad2Id-ciudad3Text,ciudad3Id
	private void transFormToListaCiudades(ListaCiudadesBean listaCiudadesDeseadas, String[] ciudadesDeseadas){					
		List<CiudadBean> listaCiudades = new ArrayList<CiudadBean>();	
		for(int i=0; i<ciudadesDeseadas.length; i++){
			CiudadBean ciudad = new CiudadBean();
			ciudad.setId(Integer.valueOf( ciudadesDeseadas[i].split(",")[1]) );
			ciudad.setCiudad( ciudadesDeseadas[i].split(",")[0] );
			listaCiudades.add(ciudad);
		}			
		listaCiudadesDeseadas.setCiudades(listaCiudades);		
	}

}

